﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"

namespace gcmp
{
    class IParameterGroupSorter;

    /// \brief 参数分组、排序管理
    class GCMP_MODEL_INTERFACE_EXPORT IElementParameterGroupSorterManager
    {
    public:
        /// \brief 注册参数分组、分组顺序以及参数顺序调整接口 
        /// 
        /// 如果程序中注册了多个排序器，那么只有最后一个注册的才是有效（注意注册顺序不可控）
        /// \param opSorter 参数分组、分组顺序以及参数顺序调整接口 
        static void Register(OwnerPtr<IParameterGroupSorter> opSorter);

        /// \brief 获取参数分组、分组顺序以及参数顺序调整接口
        /// \return IParameterGroupSorter* 获取到的参数分组、分组顺序以及参数顺序调整接口
        static const IParameterGroupSorter* GetSorter();      
    };
}

/// \brief 注册参数分组、排序对象
/// 
/// 如果程序中注册了多个排序器，那么只有最后一个注册的才是有效（注意注册顺序不可控）
#define REGISTER_PARAMETER_GROUP_SORTER(CLASS_NAME) \
    void CreateGroupSorer##CLASS_NAME() \
    {\
        IElementParameterGroupSorterManager::Register(NEW_AS_OWNER_PTR(CLASS_NAME)); \
    }\
    ONE_TIME_INITIALIZER(CreateGroupSorer##CLASS_NAME);

